package callForPapers;


import java.util.*;

import notas.Nota;

import sistema.AreaDeInteres;
import sistema.Mail;
import sistema.Usuario;
import estadosPaper.Estado;
import estadosPaper.SinRevisar;

public class Paper {

	
	private Usuario autor;
	private Set<AreaDeInteres> areasDeInteres;
	private Estado estado;
	private List<Nota> notas; 
	private Set<Usuario> revisores;
	private String titulo;
	private String resumen;
	private String pdf;
	

	//////////////////////////////////////////////////////////////////////////////
	
	//contructor
	
	
		public Paper() {
		areasDeInteres = new HashSet<AreaDeInteres>();
		estado = new SinRevisar(this);
		notas = new ArrayList<Nota>();
		revisores = new HashSet<Usuario>();
	}
		
		public Paper(Usuario autor) {
			areasDeInteres = new HashSet<AreaDeInteres>();
			estado = new SinRevisar(this);
			notas = new ArrayList<Nota>();
			revisores = new HashSet<Usuario>();
			
		}
		
		public Paper(Usuario autor ,AreaDeInteres areaInteres) {
			// Constructor para pasarle una sola area de interes.
			areasDeInteres = new HashSet<AreaDeInteres>();
			areasDeInteres.add(areaInteres);
			estado = new SinRevisar(this);
			notas = new ArrayList<Nota>();
			revisores = new HashSet<Usuario>();
			
		}
		
		public Paper(Usuario autor, Set<AreaDeInteres> areasInteres) {
			// Constructor para pasarle una lista de Areas de interes.
			areasDeInteres = new HashSet<AreaDeInteres>();
			areasDeInteres.addAll(areasInteres);
			estado = new SinRevisar(this);
			notas = new ArrayList<Nota>();
			revisores = new HashSet<Usuario>();
			
		}
		
	/////////////////////////////////////////////////////////////////////////////////

		// getters y setters

	public Usuario getAutor() {
		return autor;
	}
	public void setAutor(Usuario autor) {
		this.autor = autor;
	}
	public Set<AreaDeInteres> getAreasDeInteres() {
		return areasDeInteres;
	}
	public void setAreasDeInteres(Set<AreaDeInteres> areasDeInteres) {
		this.areasDeInteres = areasDeInteres;
	}
	public Estado getEstado() {
		return estado;
	}
	public void setEstado(Estado estado) {
		this.estado = estado;
	}
	public List<Nota> getNotas() {
		return notas;
	}
	public void setNotas(List<Nota> notas) {
		this.notas = notas;
	}
	public Set<Usuario> getRevisores() {
		return revisores;
	}
	public void setRevisores(Set<Usuario> revisores) {
		this.revisores = revisores;
	}
	public String getTitulo() {
		return titulo;
	}
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	public String getResumen() {
		return resumen;
	}
	public void setResumen(String resumen) {
		this.resumen = resumen;
	}
	public String getPdf() {
		return pdf;
	}
	public void setPdf(String pdf) {
		this.pdf = pdf;
	}
	
	///////////////////////////////////////////////////////////////////////////////////
	
	//metodos
	
	/**
	 * true si el parametro tiene al menos 1 area en comun con el paper
	 * @param cfp
	 * @return
	 */
	public boolean tieneAreaEnComun(CallForPaper cfp) {
				
		for (AreaDeInteres areaPaper : this.getAreasDeInteres()) {
				if (areaPaper.isIncluded(cfp.getAreasDeInteres())) {
					return true;
			}
		}
		return false;		
	}
	
	public void agregarRevisor(Usuario revisor) {
		this.getRevisores().add(revisor);
	}
	
	public void agregarNota(Nota nota) {
		this.estado.agregarNota(nota);
	}
	
	public void agregarNotaDesdeEstado(Nota nota) {
		this.notas.add(nota);
	}

	public void calcularNotaFinal() {
		this.getEstado().calcularNotaFinal();		
	}

	public void mandarMailRevisores() {
		for (Usuario usuarioActual : this.getRevisores()) {
			this.prepararMailRevisores(usuarioActual).send();
		}
	}

	private Mail prepararMailRevisores(Usuario usuario) {
		return new Mail(usuario.getEmail(),
				"Ud ha sido selecionado para revisar el paper "
						+ this.getTitulo(), "Este es el resumen del paper: "
						+ this.getResumen(), this.getPdf());
	}

	public void mandarMailAutor() {
		this.prepararMailAutor(this.getAutor()).send();

	}

	public Mail prepararMailAutor(Usuario usuario) {

		return new Mail(usuario.getEmail(), "Su paper ha sido "
				+ this.estado.getDescripcion(), "Su paper " + this.getTitulo()
				+ "ha sido" + this.estado.getDescripcion(), this.getPdf());

	}
	
	public Map<String,String> verNotasYComentarios(){
		return this.getEstado().verNotasYComentarios();
	}
		

	public boolean esAutor(Usuario autor) {
		return this.getAutor().equals(autor);
	}
}

